regs->cr_iip = ((unsigned long)PSCBX(v, iva) + vector) & ~0xffUL;
regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
+ if (PSCB(v, dcr) & IA64_DCR_BE)
+ regs->cr_ipsr |= IA64_PSR_BE;
if (PSCB(v, hpsr_dfh))
regs->cr_ipsr |= IA64_PSR_DFH;
regs->cr_iip = v->arch.event_callback_ip;
regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET;
+ if (PSCB(v, dcr) & IA64_DCR_BE)
+ regs->cr_ipsr |= IA64_PSR_BE;
if (PSCB(v, hpsr_dfh))
regs->cr_ipsr |= IA64_PSR_DFH;
// just handle psr.sp,pp and psr.i,ic (and user mask) for now
mask =
IA64_PSR_PP | IA64_PSR_SP | IA64_PSR_I | IA64_PSR_IC | IA64_PSR_UM |
- IA64_PSR_DT | IA64_PSR_DFL | IA64_PSR_DFH;
+ IA64_PSR_DT | IA64_PSR_DFL | IA64_PSR_DFH | IA64_PSR_BE;
if (imm24 & ~mask)
return IA64_ILLOP_FAULT;
if (imm.dfh) {
ipsr->up = 1;
psr.up = 1;
}
- if (imm.be) {
- printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
- return IA64_ILLOP_FAULT;
- }
+ if (imm.be)
+ ipsr->be = 1;
if (imm.dt)
vcpu_set_metaphysical_mode(vcpu, FALSE);
__asm__ __volatile(";; mov psr.l=%0;; srlz.d"::"r"(psr):"memory");
vcpu_set_metaphysical_mode(vcpu, FALSE);
else
vcpu_set_metaphysical_mode(vcpu, TRUE);
- if (newpsr.be) {
- printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
- return IA64_ILLOP_FAULT;
- }
+ if (newpsr.be)
+ ipsr->be = 1;
if (enabling_interrupts &&
vcpu_check_pending_interrupts(vcpu) != SPURIOUS_VECTOR)
PSCB(vcpu, pending_interruption) = 1;
//printk("*** vcpu_get_ipsr_int_state (0x%016lx)...\n",prevpsr);
psr.i64 = prevpsr;
- psr.ia64_psr.be = 0;
- if (dcr & IA64_DCR_BE)
- psr.ia64_psr.be = 1;
psr.ia64_psr.pp = 0;
if (dcr & IA64_DCR_PP)
psr.ia64_psr.pp = 1;
psr.ia64_psr.it = 1;
psr.ia64_psr.bn = 1;
//psr.pk = 1; // checking pkeys shouldn't be a problem but seems broken
- if (psr.ia64_psr.be) {
- printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n");
- return IA64_ILLOP_FAULT;
- }
ifs = PSCB(vcpu, ifs);
if (ifs & 0x8000000000000000UL)
snprintf(s, sizeof(s), "xen-%d.%d-ia64 ", major, minor);
safe_strcat(*info, s);
+ snprintf(s, sizeof(s), "xen-%d.%d-ia64be ", major, minor);
+ safe_strcat(*info, s);
+
if (vmx_enabled)
{
snprintf(s, sizeof(s), "hvm-%d.%d-ia64 ", major, minor);